package de.gof.ppstool.lagerverwaltung;

import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.gof.ppstool.lagerverwaltung.db.Arbeitsplatz;
import de.gof.ppstool.lagerverwaltung.db.ArbeitsplatzNotFoundException;
import de.gof.ppstool.lagerverwaltung.db.ILagerverwaltungDAO;
import de.gof.ppstool.lagerverwaltung.db.Teil;
import de.gof.ppstool.lagerverwaltung.db.TeilNotFoundException;
import de.gof.ppstool.lagerverwaltung.db.TeileArtNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service(ILagerverwaltung.NAME)
@Transactional
public class Lagerverwaltung implements ILagerverwaltung, Serializable {
	private static final long serialVersionUID = 3754753070947750396L;
	private static final Logger LOG = LoggerFactory
			.getLogger(Lagerverwaltung.class);
	@SuppressWarnings("unused")
	@PersistenceContext
	private EntityManager em;
	@Autowired
	private ILagerverwaltungDAO dao;

	public Lagerverwaltung() {
		super();
		LOG.debug("Lagerverwaltung");
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public Arbeitsplatz aendereArbeitsplatz(Arbeitsplatz arbeitsplatz)
			throws ArbeitsplatzNotFoundException {
		if (arbeitsplatz == null) {
			return null;
		}

		arbeitsplatz = dao.aendereArbeitsplatz(arbeitsplatz);
		return arbeitsplatz;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public Teil aendereTeil(Teil teil) throws TeilNotFoundException {
		if (teil == null) {
			return null;
		}

		teil = dao.aendereTeil(teil);
		return teil;
	}

	/**
	 * { @inheritDoc}
	 * @throws LagerverwaltungException  
	 */
	@Transactional
	@Override
	public Arbeitsplatz erstelleArbeitsplatz(Arbeitsplatz arbeitsplatz)
			throws LagerverwaltungException {
		throw new LagerverwaltungException(
				"Method erstelleArbeitsplatz() not implemented -> not needed");
	}

	/**
	 * { @inheritDoc}
	 * @throws LagerverwaltungException  
	 */
	@Transactional
	@Override
	public Teil erstelleTeil(Teil teil) throws LagerverwaltungException {
		throw new LagerverwaltungException(
				"Method erstelleTeil() not implemented -> not needed");
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public List<Arbeitsplatz> findeAlleArbeitsplaetze()
			throws ArbeitsplatzNotFoundException {
		List<Arbeitsplatz> arbeisplaetze = null;
		try {
			arbeisplaetze = dao.findeAlleArbeitsplaetze();
		} catch (ArbeitsplatzNotFoundException e) {
			throw e;
		}

		return arbeisplaetze;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional(readOnly = true)
	@Override
	public List<Teil> findeAlleTeile() throws TeilNotFoundException {
		List<Teil> teile = null;
		try {
			teile = dao.findeAlleTeile();
		} catch (TeilNotFoundException e) {
			throw e;
		}

		return teile;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public Arbeitsplatz findeArbeitsplatzNachId(Long arbeitsplatzId)
			throws ArbeitsplatzNotFoundException {
		Arbeitsplatz arbeitsplatz = null;
		try {
			arbeitsplatz = dao.findeArbeitsplatzNachId(arbeitsplatzId);
		} catch (ArbeitsplatzNotFoundException e) {
			throw e;
		}

		return arbeitsplatz;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public Teil findeTeilNachTeilId(Long teilId) throws TeilNotFoundException {
		Teil teil = null;
		try {
			teil = dao.findeTeilNachTeilId(teilId);
		} catch (TeilNotFoundException e) {
			throw e;
		}

		return teil;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public Teil findeTeilNachTeilId2(Long teilId) throws TeilNotFoundException {
		Teil teil = null;
		try {
			teil = dao.findeTeilNachTeilId2(teilId);
		} catch (TeilNotFoundException e) {
			throw e;
		}

		return teil;
	}

	/**
	 * { @inheritDoc}
	 * @throws TeilNotFoundException  
	 */
	@Transactional
	@Override
	public Double ermittleLagerwert() throws TeilNotFoundException {
		List<Teil> alleTeile = findeAlleTeile();
		//BigDecimal lagerwert = new BigDecimal(0);
		Double lagerwert = new Double(0);
		for (int i = 0; i < alleTeile.size() - 1; i++) {
			Double preis = alleTeile.get(i).getPreis();
			Integer lagerbestand = alleTeile.get(i).getLagerbestand();
			lagerwert += preis.doubleValue()
					* Double.parseDouble(lagerbestand.toString());
			//lagerwert.add(alleTeile.get(i).getPreis().multiply(BigDecimal.valueOf(Double.parseDouble(alleTeile.get(i).getLageberbestand().toString()))));
		}
		return lagerwert;
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public void loescheArbeitsplatz(Arbeitsplatz arbeitsplatz)
			throws ArbeitsplatzNotFoundException, LagerverwaltungException {
		throw new LagerverwaltungException(
				"Method loescheArbeitsplatz() not implemented -> not needed");
	}

	/**
	 * { @inheritDoc}
	 */
	@Transactional
	@Override
	public void loescheTeil(Teil teil) throws TeilNotFoundException,
			LagerverwaltungException {
		throw new LagerverwaltungException(
				"Method loescheTeil() not implemented -> not needed");
	}

	/**
	 * { @inheritDoc}
	 * @throws TeileArtNotFoundException  
	 */
	@Transactional
	@Override
	public List<Teil> findeAlleTeileNachArt(String teilart)
			throws TeileArtNotFoundException {
		List<Teil> teile = null;
		teile = dao.findeTeilNachTeileArt(teilart);
		if (teile == null) {
			throw new TeileArtNotFoundException(teilart);
		}

		return teile;
	}

}
